package com.jd.tuning.jvm.lock.syn;

public class SynchronizedTest1  implements  Runnable{

    /**
     * 什么情况会有线程安全问题
     * 1、存在共享数据
     * 2、多个线程同时操作共享数据
     */
    private static  int i=0;

    /**
     * 假设两个线程都是10 11=10+1；
     * 两个线程不能同时访问，如果同时访问的话，都是10+1所以就少加了
     *
     * synchronized 互斥，另外一个线程只能等待，就像是上厕所一样
     */
    private synchronized void increase(){
        //i=i+1;
        i++;
        this.someMethod();      //只要持有外层的锁，也可以持有内层的锁
    }


    private synchronized void someMethod(){
        System.out.println(1);
    }

    @Override
    public void run() {
            for(int j=0;j<10000;j++){
                increase();
            }
    }

    public static void main(String[] args) throws InterruptedException {
        SynchronizedTest1 t=new SynchronizedTest1();
        Thread t1=new Thread(t);
        t1.start();
        Thread t2=new Thread(t);
        t2.start();
        //等待两个线程停止
        t1.join();
        t2.join();
        System.out.println(i);
    }
}
